package ClassDay4;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component//先让spring识别到
@Aspect//在标注这是一个Aop配置的类
public class AopClass {
    @Pointcut("execution(* ClassDay4.Dao.AppDao5+.*(*))")//切入点，表示在哪个地方切入，execution表示进行的操作
    //语法通常是(返回类型 包名+类名+函数名)，项目需要配置的函数多的话可以使用正则表达式进行匹配配置,正则表达式是可以组合的
    // *代表必须有一个或多个字符
    //.代表可有可无
    //+表示类继承该类的子类
    private void pt() {}

 //   @Before("pt()")//这个注解是绑定切入点和功能，下面的函数是功能
 //   @After("pt()")
    public void UpDataAdd() {
        System.out.println(System.currentTimeMillis());
    }
    @Around(value="pt()")
    //环绕是将原始方法放到功能语句中，调用原始语句需要添加名为ProceedingJoinPoint(执行连接点)的接口，来进行调用
    //如果你的原始方法有返回值的话，那么功能不返回的话会抛出异常，所以功能也得返回，一般Object就行了
    public void FunPlus(ProceedingJoinPoint pjp){
        Object[] args = pjp.getArgs();
        System.out.println("环绕方法前"+args[0]);//PJP的getargs方法可以获取原始方法的构造参数
        try{
            pjp.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        System.out.println("环绕方法后");
    }
    //@AfterReturning注解，不常用，和afer注解一样，但抛出异常后无法运行
    //@AfterThrowing注解，抛出异常后执行的操作
}
